#include<bits/stdc++.h>
using namespace std;
vector<int>q[100005];
int d[100005][25],a[100005],b[100005];
struct nb{
    vector<long long>a;
    long long b;
}t[200005][25];
int X[4];
int pw2[25],n,m,k;
int mx[200005][25];
#define mid (l+r)/2
void build(int p,int l,int r,int dep){
    t[p][dep].b=1ll*(l+r)*(r-l+1)/2;
    t[p][dep].a.clear();
    if(dep==0){
        return;
    }
    build(p*2-1,l,mid,dep-1);
    build(p*2,mid+1,r,dep-1);
}
void ch(int x,int dep){
    int ls=x*2-1,rs=x*2;
    t[x][dep].a.clear();
    t[x][dep].b=0;
    if(d[x][dep]==0){
        if(t[ls][dep-1].b){t[x][dep].b=t[ls][dep-1].b+t[rs][dep-1].b,t[x][dep].a=t[rs][dep-1].a;
            for(auto v:t[ls][dep-1].a)if(b[v]>=dep)t[x][dep].a.push_back(v);
        }
        else if(b[t[ls][dep-1].a[0]]>=dep)t[x][dep]=t[ls][dep-1];
        else t[x][dep]=t[rs][dep-1];
    }
    else {
        if(t[rs][dep-1].b){
            t[x][dep].b=t[ls][dep-1].b+t[rs][dep-1].b,t[x][dep].a=t[ls][dep-1].a;
            for(auto v:t[rs][dep-1].a)if(b[v]>=dep)t[x][dep].a.push_back(v);
        }
        else if(b[t[rs][dep-1].a[0]]>=dep)t[x][dep]=t[rs][dep-1];
        else t[x][dep]=t[ls][dep-1];
        //cout<<
    }
}
void upt(int x){
    int now=x;
    t[x][0].a.push_back(x);
    t[x][0].b=0;
    for(int i=1;i<=k;i++){
        now=(now+1)/2;
        ch(now,i);
    }
}
int main(){
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    cin.tie(0);
    pw2[0]=1;
    for(int i=1;i<=24;i++)pw2[i]=pw2[i-1]*2;
    cin>>n>>m;
    k=lower_bound(pw2,pw2+21,n)-pw2;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        q[x].push_back(i);
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=pw2[k-i];j++)scanf("%1d",&d[j][i]);
    }
    int T;
    cin>>T;
    while(T--){
        long long anss=0;
        cin>>X[0]>>X[1]>>X[2]>>X[3];
        //cout<<d[1][1]<<endl;
        for(int i=1;i<=n;i++){
            b[i]=a[i]^X[i%4];
        }
        build(1,1,pw2[k],k);
        for(int i=1;i<=n;i++){
            int now=lower_bound(pw2,pw2+21,i)-pw2;
            upt(i);
            long long ans=0;
            ans=t[1][now].b;
            for(auto v:t[1][now].a)ans+=v;
            //cout<<ans<<"\n";
            for(auto v:q[i])anss=anss^(ans*v);
        }
        cout<<anss<<"\n";
    }
    return 0;
}
//g++ arena.cpp -o arena